import socket
import threading
import requests
import time
import json
import re
from datetime import datetime


# ========== 天气数据获取模块 ==========

def get_weather_data():
    """
    获取天气数据的函数
    """
    # 基础URL
    base_url = "https://d1.weather.com.cn/sk_2d/101020300.html"

    # 构建带时间戳的URL
    url = f"{base_url}?_{int(time.time() * 1000)}"

    # 请求头
    headers = {
        'Host': 'd1.weather.com.cn',
        'Referer': 'https://e.weather.com.cn/',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }

    try:
        # 发送GET请求
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'

        if response.status_code == 200:
            print("请求成功！")
            return parse_weather_data(response.text)
        else:
            print(f"请求失败，状态码: {response.status_code}")
            return None

    except requests.exceptions.RequestException as e:
        print(f"请求发生错误: {e}")
        return None


def parse_weather_data(raw_data):
    """
    解析天气数据的函数
    """
    try:
        # 使用正则表达式提取JSON数据
        match = re.search(r'var dataSK\s*=\s*({.*?});', raw_data)
        if match:
            return json.loads(match.group(1))

        # 如果直接包含dataSK变量
        if 'dataSK=' in raw_data:
            json_str = raw_data.split('dataSK=')[1].split(';')[0]
            return json.loads(json_str)

        # 尝试直接解析JSON
        return json.loads(raw_data.strip())

    except (json.JSONDecodeError, IndexError, AttributeError) as e:
        print(f"解析天气数据时出错: {e}")
        # 备用方法：手动提取键值对
        return dict(re.findall(r'"([^"]+)":"([^"]*)"', raw_data))


def format_weather_data(weather_data):
    """
    格式化天气数据为字典，并去掉单位
    """
    if not weather_data:
        return None

    # 字段中文映射（不带单位）
    field_mapping = {
        'nameen': 'nameen',  # '英文名
        # 'cityname': 'RealtimeWeatherData.cityname',  # 城市
        # 'city': 'RealtimeWeatherData.city',  # 城市代码
        'temp': 'temp',  # 温度
        # 'tempf': 'RealtimeWeatherData.tempf',  # 温度
        # 'WD': 'RealtimeWeatherData.WD',  # 风向
        'wde': 'wde',  # 风向英文
        # 'WS': 'RealtimeWeatherData.WS',  # 风速
        'wse': 'wse',  # 风速
        'SD': 'SD',  # 湿度
        # 'sd': 'RealtimeWeatherData.sd',  # 湿度
        'qy': 'qy',  # 气压
        'njd': 'njd',  # 能见度
        'time': 'updatetime',  # 更新时间
        'rain': 'rain',  # 降雨量
        'rain24h': 'rain24h',  # 24小时降雨
        'aqi': 'aqi',  # 空气质量指数
        'aqi_pm25': 'aqi_pm25',  # PM2.5
        # 'weather': 'RealtimeWeatherData.weather',  # 天气状况
        'weathere': 'weathere',  # 天气英文
        # 'weathercode': 'RealtimeWeatherData.weathercode',  # 天气代码
        # 'limitnumber': 'RealtimeWeatherData.limitnumber',  # 限行号码
        # 'date': 'RealtimeWeatherData.date_'  # 日期
    }

    # 创建格式化后的字典
    formatted_data = {}

    for key, value in weather_data.items():
        if key in field_mapping:
            display_name = field_mapping.get(key, key)
            formatted_data[display_name] = value

    return formatted_data


# ========== Socket 通信模块 ==========
HOST = "192.168.1.106"  # 修改为本机 IP
PORT = 5678


def handle_client(conn, addr):
    print(f"[连接建立] {addr}")
    try:
        while True:
            data = conn.recv(2048)
            if not data:
                print(f"[连接断开] {addr}")
                break

            msg = data.decode('utf-8', errors='ignore').strip()
            print(f"[接收命令] {msg}")

            # 命令解析
            if msg == "fun1":
                print("[命令] 获取天气数据中...")
                weather_raw = format_weather_data(get_weather_data())

                if weather_raw:
                    reply = json.dumps(weather_raw, ensure_ascii=False)
                else:
                    reply = json.dumps({"error": "无法获取天气数据"}, ensure_ascii=False)

            else:
                reply = f"未知命令: {msg}"

            conn.sendall(reply.encode('utf-8'))
            print(f"[已发送回复] {reply}")

    except Exception as e:
        print(f"[错误] 处理连接时异常: {e}")
    finally:
        conn.close()


def start_server():
    """启动 socket 服务器"""
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((HOST, PORT))
    server.listen(5)
    print(f"[服务器启动] 正在监听 {HOST}:{PORT}")

    while True:
        conn, addr = server.accept()
        threading.Thread(target=handle_client, args=(conn, addr), daemon=True).start()


# ========== 程序入口 ==========
if __name__ == "__main__":
    start_server()


